🎖️GitЯра🎖️
Node / meshtastic / Meshtastic-Android / files / core / model / src / commonMain / kotlin / org / meshtastic / core / model / RouteDiscovery.kt
Displaying Raw • Download
core/model/src/commonMain/kotlin/org/meshtastic/core/model/RouteDiscovery.kt bd2863243bab6eb213401d949839a2bc74dde7e2 (bd286324) Text, 4.83 KB
T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.core.model
Tff7b72import T7ee787co.touchlab.kermit.Logger
Tff7b72import T7ee787org.meshtastic.core.model.util.decodeOrNull
Tff7b72import T7ee787org.meshtastic.proto.MeshPacket
Tff7b72import T7ee787org.meshtastic.proto.PortNum
Tff7b72import T7ee787org.meshtastic.proto.RouteDiscovery
Tff7b72val Te6edf3MeshPacketTb4b4b4.Te6edf3fullRouteDiscoveryTb4b4b4: Te6edf3RouteDiscovery?
Tff7b72getTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3d Tff7b72= Te6edf3decoded
Tff7b72if Tb4b4b4(Te6edf3d Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72& Tff7b72!Te6edf3dTb4b4b4.Te6edf3want_response Tff7b72&Tff7b72& Te6edf3dTb4b4b4.Te6edf3portnum Tff7b72=Tff7b72= Te6edf3PortNumTb4b4b4.Te6edf3TRACEROUTE_APPTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3originalRd Tff7b72= Te6edf3RouteDiscoveryTb4b4b4.Te6edf3ADAPTERTb4b4b4.Te6edf3decodeOrNullTb4b4b4(Te6edf3dTb4b4b4.Te6edf3payloadTb4b4b4, Te6edf3LoggerTb4b4b4) Tff7b72?: Tff7b72return Tff7b72null
Tff7b72val Te6edf3destinationId Tff7b72= Tff7b72if Tb4b4b4(Te6edf3dTb4b4b4.Te6edf3dest Tff7b72!Tff7b72= T79c0ff0Tb4b4b4) Te6edf3dTb4b4b4.Te6edf3dest Tff7b72else Tff7b72thisTb4b4b4.Te6edf3to
Tff7b72val Te6edf3sourceId Tff7b72= Tff7b72if Tb4b4b4(Te6edf3dTb4b4b4.Te6edf3source Tff7b72!Tff7b72= T79c0ff0Tb4b4b4) Te6edf3dTb4b4b4.Te6edf3source Tff7b72else Tff7b72thisTb4b4b4.Te6edf3from
T8b949e// Note: Wire lists are immutable
Tff7b72val Te6edf3fullRoute Tff7b72= Te6edf3listOfTb4b4b4(Te6edf3destinationIdTb4b4b4) Tff7b72+ Te6edf3originalRdTb4b4b4.Te6edf3route Tff7b72+ Te6edf3sourceId
Tff7b72val Te6edf3fullRouteBack Tff7b72= Te6edf3listOfTb4b4b4(Te6edf3sourceIdTb4b4b4) Tff7b72+ Te6edf3originalRdTb4b4b4.Te6edf3route_back Tff7b72+ Te6edf3destinationId
T8b949e// hopStart was not populated prior to 2.3.0. The bitfield was added in 2.5.0 and
T8b949e// is used to detect versions where hopStart can be trusted to have been set.
T8b949e// Assuming default integer values of 0 for hop_start and snr_back_count if unset.
Tff7b72val Te6edf3hopStartVal Tff7b72= Te6edf3hop_start
Tff7b72val Te6edf3hasBitfield Tff7b72= Tb4b4b4(Te6edf3dTb4b4b4.Te6edf3bitfield Tff7b72?: T79c0ff0Tb4b4b4) Tff7b72!Tff7b72= T79c0ff0
Tff7b72return Te6edf3originalRdTb4b4b4.Te6edf3copyTb4b4b4(
Te6edf3route Tff7b72= Te6edf3fullRouteTb4b4b4,
Te6edf3route_back Tff7b72=
Tff7b72if Tb4b4b4(Tb4b4b4(Te6edf3hopStartVal Tff7b72> T79c0ff0 Tff7b72|Tff7b72| Te6edf3hasBitfieldTb4b4b4) Tff7b72&Tff7b72& Te6edf3originalRdTb4b4b4.Te6edf3snr_backTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3fullRouteBack
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3originalRdTb4b4b4.Te6edf3route_back
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tff7b72return Tff7b72null
Tb4b4b4}
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffMagicNumberTa5d6ff"Tb4b4b4)
Tff7b72private Tff7b72fun Td2a8ffformatTraceroutePathTb4b4b4(Te6edf3nodesListTb4b4b4: Te6edf3ListTff7b72<Tffa657StringTff7b72>Tb4b4b4, Te6edf3snrListTb4b4b4: Te6edf3ListTff7b72<Tffa657IntTff7b72>Tb4b4b4)Tb4b4b4: Tffa657String Tb4b4b4{
T8b949e// nodesList should include both origin and destination nodes
T8b949e// origin will not have an SNR value, but destination should
Tff7b72val Te6edf3snrStr Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3snrListTb4b4b4.Te6edf3size Tff7b72=Tff7b72= Te6edf3nodesListTb4b4b4.Te6edf3size Tff7b72- T79c0ff1Tb4b4b4) Tb4b4b4{
Te6edf3snrList
Tb4b4b4} Tff7b72else Tb4b4b4{
T8b949e// use unknown SNR for entire route if snrList has invalid size
Te6edf3ListTb4b4b4(Te6edf3nodesListTb4b4b4.Te6edf3size Tff7b72- T79c0ff1Tb4b4b4) Tb4b4b4{ Tff7b72-T79c0ff1T79c0ff2T79c0ff8 Tb4b4b4}
Tb4b4b4}
Tb4b4b4.Te6edf3map Tb4b4b4{ Te6edf3snr Tff7b72-Tff7b72>
Tff7b72val Te6edf3str Tff7b72= Tff7b72if Tb4b4b4(Te6edf3snr Tff7b72=Tff7b72= Tff7b72-T79c0ff1T79c0ff2T79c0ff8Tb4b4b4) Ta5d6ff"Ta5d6ff?Ta5d6ff" Tff7b72else Ta5d6ff"Tffd700${Te6edf3snr Tff7b72/ T79c0ff4fTffd700}Ta5d6ff"
Ta5d6ff"Ta5d6ff⇊ Tffd700$Te6edf3strTa5d6ff dBTa5d6ff"
Tb4b4b4}
Tff7b72return Te6edf3nodesList
Tb4b4b4.Te6edf3map Tb4b4b4{ Te6edf3userName Tff7b72-Tff7b72> Ta5d6ff"Ta5d6ff■ Tffd700$Te6edf3userNameTa5d6ff" Tb4b4b4}
Tb4b4b4.Te6edf3flatMapIndexed Tb4b4b4{ Te6edf3iTb4b4b4, Te6edf3nodeStr Tff7b72-Tff7b72> Tff7b72if Tb4b4b4(Te6edf3i Tff7b72=Tff7b72= T79c0ff0Tb4b4b4) Te6edf3listOfTb4b4b4(Te6edf3nodeStrTb4b4b4) Tff7b72else Te6edf3listOfTb4b4b4(Te6edf3snrStrTff7b72[Te6edf3i Tff7b72- T79c0ff1Tff7b72]Tb4b4b4, Te6edf3nodeStrTb4b4b4) Tb4b4b4}
Tb4b4b4.Te6edf3joinToStringTb4b4b4(Ta5d6ff"Ta5d6ff\Ta5d6ffnTa5d6ff"Tb4b4b4)
Tb4b4b4}
Tff7b72fun Te6edf3RouteDiscoveryTb4b4b4.Td2a8ffgetTracerouteResponseTb4b4b4(
Te6edf3getUserTb4b4b4: Tb4b4b4(Te6edf3nodeNumTb4b4b4: Tffa657IntTb4b4b4) Tff7b72-Tff7b72> Tffa657StringTb4b4b4,
Te6edf3headerTowardsTb4b4b4: Tffa657String Tff7b72= Ta5d6ff"Ta5d6ffRoute traced toward destination:Ta5d6ff\Ta5d6ffnTa5d6ff\Ta5d6ffnTa5d6ff"Tb4b4b4,
Te6edf3headerBackTb4b4b4: Tffa657String Tff7b72= Ta5d6ff"Ta5d6ffRoute traced back to us:Ta5d6ff\Ta5d6ffnTa5d6ff\Ta5d6ffnTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4: Tffa657String Tff7b72= Te6edf3buildString Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3routeTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3appendTb4b4b4(Te6edf3headerTowardsTb4b4b4)
Te6edf3appendTb4b4b4(Te6edf3formatTraceroutePathTb4b4b4(Te6edf3routeTb4b4b4.Te6edf3mapTb4b4b4(Te6edf3getUserTb4b4b4)Tb4b4b4, Te6edf3snr_towardsTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3route_backTb4b4b4.Te6edf3isNotEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3appendTb4b4b4(Ta5d6ff"Ta5d6ff\Ta5d6ffnTa5d6ff\Ta5d6ffnTa5d6ff"Tb4b4b4)
Te6edf3appendTb4b4b4(Te6edf3headerBackTb4b4b4)
Te6edf3appendTb4b4b4(Te6edf3formatTraceroutePathTb4b4b4(Te6edf3route_backTb4b4b4.Te6edf3mapTb4b4b4(Te6edf3getUserTb4b4b4)Tb4b4b4, Te6edf3snr_backTb4b4b4)Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72fun Te6edf3MeshPacketTb4b4b4.Td2a8ffgetTracerouteResponseTb4b4b4(
Te6edf3getUserTb4b4b4: Tb4b4b4(Te6edf3nodeNumTb4b4b4: Tffa657IntTb4b4b4) Tff7b72-Tff7b72> Tffa657StringTb4b4b4,
Te6edf3headerTowardsTb4b4b4: Tffa657String Tff7b72= Ta5d6ff"Ta5d6ffRoute traced toward destination:Ta5d6ff\Ta5d6ffnTa5d6ff\Ta5d6ffnTa5d6ff"Tb4b4b4,
Te6edf3headerBackTb4b4b4: Tffa657String Tff7b72= Ta5d6ff"Ta5d6ffRoute traced back to us:Ta5d6ff\Ta5d6ffnTa5d6ff\Ta5d6ffnTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4: Tffa657String? Tff7b72= Te6edf3fullRouteDiscoveryTff7b72?.Te6edf3getTracerouteResponseTb4b4b4(Te6edf3getUserTb4b4b4, Te6edf3headerTowardsTb4b4b4, Te6edf3headerBackTb4b4b4)
Tff7b72enum Tff7b72class T56d364TracerouteMapAvailability Tb4b4b4{
Te6edf3OkTb4b4b4,
Te6edf3MissingEndpointsTb4b4b4,
Te6edf3NoMappableNodesTb4b4b4,
Tb4b4b4}
Tff7b72fun Td2a8ffevaluateTracerouteMapAvailabilityTb4b4b4(
Te6edf3forwardRouteTb4b4b4: Te6edf3ListTff7b72<Tffa657IntTff7b72>Tb4b4b4,
Te6edf3returnRouteTb4b4b4: Te6edf3ListTff7b72<Tffa657IntTff7b72>Tb4b4b4,
Te6edf3positionedNodeNumsTb4b4b4: Te6edf3SetTff7b72<Tffa657IntTff7b72>Tb4b4b4,
Tb4b4b4)Tb4b4b4: Te6edf3TracerouteMapAvailability Tb4b4b4{
Tff7b72val Te6edf3endpoints Tff7b72=
Te6edf3listOfNotNullTb4b4b4(
Te6edf3forwardRouteTb4b4b4.Te6edf3firstOrNullTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3forwardRouteTb4b4b4.Te6edf3lastOrNullTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3returnRouteTb4b4b4.Te6edf3firstOrNullTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3returnRouteTb4b4b4.Te6edf3lastOrNullTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4.Te6edf3distinctTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3missingEndpoint Tff7b72= Te6edf3endpointsTb4b4b4.Te6edf3any Tb4b4b4{ Tff7b72!Te6edf3positionedNodeNumsTb4b4b4.Te6edf3containsTb4b4b4(Tffa657itTb4b4b4) Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3missingEndpointTb4b4b4) Tff7b72return Te6edf3TracerouteMapAvailabilityTb4b4b4.Te6edf3MissingEndpoints
Tff7b72val Te6edf3relatedNodeNums Tff7b72= Tb4b4b4(Te6edf3forwardRoute Tff7b72+ Te6edf3returnRouteTb4b4b4)Tb4b4b4.Te6edf3toSetTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3hasAnyMappable Tff7b72= Te6edf3relatedNodeNumsTb4b4b4.Te6edf3any Tb4b4b4{ Te6edf3positionedNodeNumsTb4b4b4.Te6edf3containsTb4b4b4(Tffa657itTb4b4b4) Tb4b4b4}
Tff7b72return Tff7b72if Tb4b4b4(Te6edf3hasAnyMappableTb4b4b4) Te6edf3TracerouteMapAvailabilityTb4b4b4.Te6edf3Ok Tff7b72else Te6edf3TracerouteMapAvailabilityTb4b4b4.Te6edf3NoMappableNodes
Tb4b4b4}
Served by rngit 1.5.0 - Generated in 0.06s